// 封装购物车模块

import { defineStore } from 'pinia'
import { ref,computed } from 'vue'
import { useUserStore } from './userStore'
import { findNewCartListAPI, insertCartAPI,delCartAPI} from '@/apis/cart'

export const useCartStore = defineStore('cart',()=>{

    const userStore = useUserStore()
    const isLogin = computed(()=>userStore.userInfo.token)

    // 1. 定义state - cartList
    const cartList = ref([])
    // 2. 定义action - addCart
    const addCart = async (goods)=>{    
        if(isLogin.value){
        // 登录后的逻辑
        const { skuId, count } = goods
        // 加入购物车列表
        await insertCartAPI({ skuId, count })
        // 获取最新列表
        updateNewList()

        }else{
        // 添加购物车操作
        // 已经添加过 - count + 1
        // 没添加过 - 直接push
        // 思路：通过匹配传递过来的商品的skuId能不能在cartList中找到，找到了就是添加过
        const item = cartList.value.find(item => goods.skuId === item.skuId )
        if(item){
            // 已经添加过
            item.count += goods.count
        }else{
            // 没添加过
            cartList.value.push(goods)
        }
        }
        
    }
    // 删除购物车
    const delCart = async(skuId)=>{
        if(isLogin.value){
        // 登录后的逻辑 调用接口删除
        await delCartAPI([skuId])
        updateNewList()
        }else{
        // 思路
        // 1. 找到要删除的下标值 - splice
        // 2. 使用数组的过滤方法 - filter
        const idx = cartList.value.findIndex(item => skuId === item.skuId)
        cartList.value.splice(idx,1)
        }
        
    }
    // 退出登录时清空购物车数据
    const clearCart = ()=>{
        cartList.value = []
    } 

    // 获取最新购物车列表数据
    const updateNewList = async()=>{
        const res = await findNewCartListAPI()
        cartList.value = res.result
    }


    // 单选功能
    const singleCheck = (skuId,selected)=>{
        // 通过skuId找到要修改的项 然后把selected修改为传过来的selected
        const item = cartList.value.find(item => item.skuId === skuId)
        item.selected = selected
    }
    // 全选功能
    const allCheck = (selected)=>{
        // 1. 遍历修改 - forEach
        cartList.value.forEach(item => item.selected = selected)
        
    }
    // 计算属性
    // 1. 总的数量
    const allCount = computed(()=> cartList.value.reduce((a,c) => a + c.count,0))
    // 2. 总价
    const allPrice = computed(()=> cartList.value.reduce((a,c) => a + c.count * c.price,0))
    // 3. 已选择数量
    const selectedCount = computed(()=> cartList.value.filter(item => item.selected).reduce((a,c) => a + c.count,0))
    // 4. 已选择商品的总价
    const selectedPrice = computed(()=> cartList.value.filter(item => item.selected).reduce((a,c) => a + c.count * c.price,0))

    // 是否全选
    const isAll = computed(()=> cartList.value.every(item => item.selected) )
    return {
        cartList,
        addCart,
        delCart,
        allCount,
        allPrice,
        singleCheck,
        isAll,
        allCheck,
        selectedCount,
        selectedPrice,
        clearCart,
        updateNewList
    }
},
{persist:true})